home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / libs / sphigs / sph_mac.hqx / SRGP port to 5.0 (compressed) / SRGP_SPHIGS Root / MacSRGP / srgp_attrib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-13  |  16.6 KB  |  706 lines

  1. #include "HEADERS.h"
  2. #include "srgplocal.h"
  3.  
  4. #define __CURATT(xx)    srgp__curActiveCanvasSpec.attributes.xx
  5.  
  6.  
  7. #ifdef THINK_C
  8. #include "ChooseWhichQuickDraw.h"
  9. #endif
  10.  
  11. #ifdef X11
  12. static XGCValues gcvals;
  13.  
  14. static unsigned char writemode_table[4] = {
  15.    /*REPLACE*/    0x3, /* GXcopy from /usr/include/X11/X.h */
  16.    /*XOR*/     0x6, /* GXxor */
  17.    /*OR*/     0x7, /* GXor */
  18.    /*AND*/     0x1  /* GXand */
  19. };
  20.   
  21. static unsigned char inv_writemode_table[4] = {
  22.    /*REPLACE*/ 0x3, /* GXcopy */
  23.    /*XOR*/     0x9, /* GXequiv */
  24.    /*OR*/      0x1, /* GXand */
  25.    /*AND*/     0x7  /* GXor */
  26. };
  27.  
  28. #endif
  29.  
  30. #ifdef THINK_C
  31. #ifdef COLOR_QUICKDRAW
  32. static unsigned char transfermode_table[4][4] = {
  33.       /*REPLACE,SOLID*/ patCopy,
  34.       /* pixmap pattern entries in this table are unused */ 0,
  35.       /*REPLACE,BITMAP_PATTERN_TRANSPARENT*/ patOr,
  36.       /*REPLACE,BITMAP_PATTERN_OPAQUE*/ patCopy,
  37.       /*XOR,SOLID*/ patXor,
  38.       /* pixmap pattern entries in this table are unused */ 0,
  39.       /*XOR,BITMAP_PATTERN_TRANSPARENT*/ patXor,
  40.       /*XOR,BITMAP_PATTERN_OPAQUE*/ patXor,
  41.       /*OR,SOLID*/ patOr,
  42.       /* pixmap pattern entries in this table are unused */ 0,
  43.       /*OR,BITMAP_PATTERN_TRANSPARENT*/ patOr,
  44.       /*OR,BITMAP_PATTERN_OPAQUE*/ patOr,
  45.       /*AND,SOLID*/ notPatBic,
  46.       /* pixmap pattern entries in this table are unused */ 0,
  47.       /*AND,BITMAP_PATTERN_TRANSPARENT*/ notPatBic,
  48.       /*AND,BITMAP_PATTERN_OPAQUE*/ notPatBic
  49. };
  50.  
  51.  
  52. #define ComputeFrameTransfermode() \
  53.    srgp__curActiveCanvasSpec.transfermode_frame = \
  54.       transfermode_table \
  55.          [srgp__curActiveCanvasSpec.attributes.write_mode] \
  56.          [srgp__curActiveCanvasSpec.attributes.pen_style]
  57.  
  58. #define ComputeFillTransfermode() \
  59.    srgp__curActiveCanvasSpec.transfermode_fill = \
  60.       transfermode_table \
  61.          [srgp__curActiveCanvasSpec.attributes.write_mode] \
  62.          [srgp__curActiveCanvasSpec.attributes.fill_style]
  63.  
  64. #define SetTextTransfermode() \
  65.    TextMode (transfermode_table \
  66.            [srgp__curActiveCanvasSpec.attributes.write_mode] \
  67.            [BITMAP_PATTERN_TRANSPARENT] \
  68.             - 8)
  69.            
  70. #else
  71.  
  72. #define DONT_DRAW   -1
  73.  
  74. #include "srgp_attrib.proto.h"
  75. static void ComputeFrameTransfermode(void);
  76. static void ComputeFillTransfermode(void);
  77. static void SetTextTransfermode(void);
  78. static char *([NUMBER_OF_LINE_STYLES ]);
  79. static void SetXLineAttributes(void);
  80.  
  81. static unsigned char transfermode_table[4][2][4] = {
  82.   {
  83.     /*REPLACE,WHITE,...*/ {notPatCopy, 0, patBic, notPatCopy},
  84.     /*REPLACE,BLACK,...*/ {patCopy, 0, patOr, patCopy},
  85.   },
  86.   {
  87.     /*XOR,WHITE,...*/ {notPatXor, 0, DONT_DRAW, notPatXor},
  88.     /*XOR,BLACK,...*/ {patXor, 0, patXor, patXor} 
  89.   },
  90.   {
  91.     /*OR,WHITE,...*/ {notPatOr, 0, DONT_DRAW, notPatOr},
  92.     /*OR,BLACK,...*/ {patOr, 0, patOr, patOr} 
  93.   },
  94.   {
  95.     /*AND,WHITE,...*/ {patBic, 0, DONT_DRAW, patBic},
  96.     /*AND,BLACK,...*/ {notPatBic, 0, notPatBic, notPatBic} 
  97.   }
  98. };
  99.  
  100.  
  101. static void ComputeFrameTransfermode (void)
  102. {
  103.    srgp__curActiveCanvasSpec.transfermode_frame = 
  104.       transfermode_table[srgp__curActiveCanvasSpec.attributes.write_mode]
  105.            [srgp__curActiveCanvasSpec.attributes.color]
  106.            [srgp__curActiveCanvasSpec.attributes.pen_style];
  107. }
  108.  
  109. static void ComputeFillTransfermode (void)
  110. {
  111.    srgp__curActiveCanvasSpec.transfermode_fill = 
  112.       transfermode_table[srgp__curActiveCanvasSpec.attributes.write_mode]
  113.            [srgp__curActiveCanvasSpec.attributes.color]
  114.            [srgp__curActiveCanvasSpec.attributes.pen_style];
  115. }
  116.  
  117. static void SetTextTransfermode (void) {
  118.    TextMode (transfermode_table
  119.            [srgp__curActiveCanvasSpec.attributes.write_mode] 
  120.         [srgp__curActiveCanvasSpec.attributes.color]
  121.            [BITMAP_PATTERN_TRANSPARENT]
  122.             - 8);
  123. }
  124.  
  125. #endif
  126.  
  127. #endif
  128.  
  129.  
  130.  
  131.  
  132. /** WRITE_MODE
  133. X11 implementation:
  134.    Both GC's must be modified.
  135. **/
  136.  
  137. void
  138. SRGP_setWriteMode (writeMode value)
  139. {
  140.    if (value == __CURATT(write_mode)) return;
  141.  
  142.    DEBUG_AIDS{
  143.       SRGP_trace (SRGP_logStream, "SRGP_setWriteMode  %d\n", value);
  144.       srgp_check_system_state();
  145.       srgp_check_write_mode(value);
  146.       LeaveIfNonFatalErr();
  147.    }
  148.  
  149.    srgp__curActiveCanvasSpec.attributes.write_mode = value;
  150.  
  151. #ifdef X11
  152.    if (XWHITE == 0)
  153.        value = writemode_table[value];
  154.    else
  155.        value = inv_writemode_table[value];
  156.    XSetFunction
  157.       (srgpx__display,
  158.        srgp__curActiveCanvasSpec.gc_frame,
  159.        value);
  160.    XSetFunction
  161.       (srgpx__display,
  162.        srgp__curActiveCanvasSpec.gc_fill,
  163.        value);
  164. #endif
  165. #ifdef THINK_C
  166.    ComputeFrameTransfermode();
  167.    ComputeFillTransfermode();
  168.    SetTextTransfermode();
  169. #endif
  170. }
  171.  
  172.  
  173.  
  174. /** CLIP_RECTANGLE
  175. Both GC's must be modified.
  176. **/
  177. void
  178. SRGP_setClipRectangle (rectangle rect)
  179. {
  180. #ifdef X11
  181.    XRectangle xrect;
  182. #endif
  183. #ifdef THINK_C
  184.    Rect r;
  185. #endif
  186.  
  187.    DEBUG_AIDS{
  188.       SRGP_trace (SRGP_logStream, "SRGP_setClipRect  (%d,%d)->(%d,%d)\n", ExplodeRect(rect));
  189.       srgp_check_system_state();
  190.       srgp_check_rectangle
  191.      (rect.bottom_left.x, rect.bottom_left.y,
  192.       rect.top_right.x, rect.top_right.y);
  193.       LeaveIfNonFatalErr();
  194.    }
  195.  
  196.    srgp__curActiveCanvasSpec.attributes.clip_rectangle = rect;
  197.    
  198. #ifdef X11
  199.    xrect.x = rect.bottom_left.x;
  200.    xrect.y = FIXED(rect.top_right.y);
  201.    xrect.width = (rect.top_right.x - rect.bottom_left.x + 1);
  202.    xrect.height = (rect.top_right.y - rect.bottom_left.y + 1);
  203.    XSetClipRectangles
  204.       (srgpx__display,
  205.        srgp__curActiveCanvasSpec.gc_frame,
  206.        0, 0,
  207.        &xrect, 1, YXSorted);
  208.    XSetClipRectangles
  209.       (srgpx__display,
  210.        srgp__curActiveCanvasSpec.gc_fill,
  211.        0, 0,
  212.        &xrect, 1, YXSorted);
  213. #endif
  214.  
  215. #ifdef THINK_C
  216.    r = FIXED_RECT(ExplodeRect(rect));
  217.    ClipRect(&r);
  218. #endif
  219. }
  220.  
  221.  
  222.  
  223.  
  224. /** FILL STYLE
  225. Only the fill GC is to be modified.
  226. The SRGP fill-style maps directly to X's fill-style.
  227. **/
  228. void
  229. SRGP_setFillStyle (drawStyle value)
  230. {
  231.    if (value == __CURATT(fill_style)) return;
  232.  
  233.    DEBUG_AIDS{
  234.       SRGP_trace (SRGP_logStream, "SRGP_setFillStyle  %d\n", value);
  235.       srgp_check_system_state();
  236.       srgp_check_fill_style(value);
  237.       LeaveIfNonFatalErr();
  238.    }
  239.    
  240.    srgp__curActiveCanvasSpec.attributes.fill_style = value;
  241.    
  242. #ifdef X11
  243.    XSetFillStyle (srgpx__display, srgp__curActiveCanvasSpec.gc_fill, value);
  244. #endif
  245.  
  246. #ifdef THINK_C
  247.    ComputeFillTransfermode();
  248.    srgp__curActiveCanvasSpec.pat_fill = (Pattern*)
  249.       ((value == SOLID) ?
  250.           black :  /*Mac's "solid" pattern*/
  251.           srgp__bitmapPatternTable
  252.              [srgp__curActiveCanvasSpec.attributes.fill_bitmap_pattern_id]);
  253. #endif      
  254. }
  255.  
  256. /*!*/
  257. void
  258. SRGP_setFillBitmapPattern (int value)
  259. {
  260.    if (value == __CURATT(fill_bitmap_pattern_id)) return;
  261.  
  262.    DEBUG_AIDS{
  263.       SRGP_trace (SRGP_logStream, "SRGP_setFillBitmapPattern  %d\n", value);
  264.       srgp_check_system_state();
  265.       srgp_check_pattern_index(value);
  266.       srgp_check_pattern_table_entry(srgp__bitmapPatternTable[value]);
  267.       LeaveIfNonFatalErr();
  268.    }
  269.  
  270.    srgp__curActiveCanvasSpec.attributes.fill_bitmap_pattern_id = value;
  271.  
  272. #ifdef X11
  273.    XSetStipple
  274.       (srgpx__display,
  275.        srgp__curActiveCanvasSpec.gc_fill,
  276.        srgp__bitmapPatternTable[value]);
  277. #endif
  278.  
  279. #ifdef THINK_C
  280.    if (srgp__curActiveCanvasSpec.attributes.fill_style != SOLID)
  281.       srgp__curActiveCanvasSpec.pat_fill = (Pattern*)srgp__bitmapPatternTable[value];
  282. #endif
  283. }
  284.  
  285. /*!*/
  286. void
  287. SRGP_setFillPixmapPattern (int value)
  288. {
  289.    if (value == __CURATT(fill_pixmap_pattern_id)) return;
  290.       
  291.    DEBUG_AIDS{
  292.       SRGP_trace (SRGP_logStream, "SRGP_setFillPixmapPattern  %d\n", value);
  293.       srgp_check_system_state();
  294.       srgp_check_pattern_index(value);
  295.       srgp_check_pattern_table_entry(srgp__pixmapPatternTable[value]);
  296.       LeaveIfNonFatalErr();
  297.    }
  298.  
  299.    srgp__curActiveCanvasSpec.attributes.fill_pixmap_pattern_id = value;
  300.  
  301. #ifdef X11
  302.    gcvals.tile = srgp__pixmapPatternTable[value];
  303.    XChangeGC (srgpx__display, srgp__curActiveCanvasSpec.gc_fill,
  304.           GCTile, &gcvals);
  305. #endif
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314. /** PEN STYLE
  315. X11 implementation:
  316.    Only the frame GC is to be modified.
  317.    The SRGP pen-style maps directly to X's fill-style.
  318. **/
  319.  
  320. void
  321. SRGP_setPenStyle (drawStyle value)
  322. {
  323.    if (value == __CURATT(pen_style)) return;
  324.  
  325.    DEBUG_AIDS{
  326.       SRGP_trace (SRGP_logStream, "SRGP_setPenStyle  %d\n", value);
  327.       srgp_check_system_state();
  328.       srgp_check_fill_style(value);
  329.       LeaveIfNonFatalErr();
  330.    }
  331.  
  332.    srgp__curActiveCanvasSpec.attributes.pen_style = value;
  333.  
  334. #ifdef X11
  335.    XSetFillStyle (srgpx__display, srgp__curActiveCanvasSpec.gc_frame, value);
  336. #endif
  337. #ifdef THINK_C
  338.    ComputeFrameTransfermode();
  339.    srgp__curActiveCanvasSpec.pat_frame = (Pattern*)
  340.       ((value == SOLID) ?
  341.          black :  /*Mac's "solid" pattern*/
  342.          srgp__bitmapPatternTable
  343.             [srgp__curActiveCanvasSpec.attributes.pen_bitmap_pattern_id]);
  344. #endif      
  345. }
  346.  
  347. /*!*/
  348. void
  349. SRGP_setPenBitmapPattern (int value)
  350. {
  351.    if (value == __CURATT(pen_bitmap_pattern_id)) return;
  352.  
  353.    DEBUG_AIDS{
  354.       SRGP_trace (SRGP_logStream, "SRGP_setPenBitmapPattern  %d\n", value);
  355.       srgp_check_system_state();
  356.       srgp_check_pattern_index(value);
  357.       srgp_check_pattern_table_entry(srgp__bitmapPatternTable[value]);
  358.       LeaveIfNonFatalErr();
  359.    }
  360.  
  361.    srgp__curActiveCanvasSpec.attributes.pen_bitmap_pattern_id = value;
  362.  
  363. #ifdef X11
  364.    XSetStipple
  365.       (srgpx__display,
  366.        srgp__curActiveCanvasSpec.gc_frame,
  367.        srgp__bitmapPatternTable[value]);
  368. #endif
  369.  
  370. #ifdef THINK_C
  371.    if (srgp__curActiveCanvasSpec.attributes.pen_style != SOLID)
  372.       srgp__curActiveCanvasSpec.pat_frame = 
  373.          (Pattern*) srgp__bitmapPatternTable[value];
  374. #endif
  375. }
  376.  
  377.  
  378.  
  379. /*!*/
  380. void
  381. SRGP_setPenPixmapPattern (int value)
  382. {
  383.    if (value == __CURATT(pen_pixmap_pattern_id)) return;
  384.  
  385.    DEBUG_AIDS{
  386.       SRGP_trace (SRGP_logStream, "SRGP_setPenPixmapPattern  %d\n", value);
  387.       srgp_check_system_state();
  388.       srgp_check_pattern_index(value);
  389.       srgp_check_pattern_table_entry(srgp__pixmapPatternTable[value]);
  390.       LeaveIfNonFatalErr();
  391.    }
  392.  
  393.    srgp__curActiveCanvasSpec.attributes.pen_pixmap_pattern_id = value;
  394.  
  395. #ifdef X11
  396.    gcvals.tile = srgp__pixmapPatternTable[value];
  397.    XChangeGC (srgpx__display, srgp__curActiveCanvasSpec.gc_frame,
  398.           GCTile, &gcvals);
  399. #endif
  400. }
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407. /** MARKER ATTRIBUTES
  408. **/
  409.  
  410. void 
  411. SRGP_setMarkerSize (int value)
  412. {
  413.    if (value == __CURATT(marker_size)) return;
  414.  
  415.    DEBUG_AIDS{
  416.       SRGP_trace (SRGP_logStream, "SRGP_setMarkerSize  %d\n", value);
  417.       srgp_check_system_state();
  418.       srgp_check_marker_size(value);
  419.       LeaveIfNonFatalErr();
  420.    }
  421.  
  422.    srgp__curActiveCanvasSpec.attributes.marker_size = value;
  423. }
  424.  
  425.  
  426. void 
  427. SRGP_setMarkerStyle (markerStyle value)
  428. {
  429.    if (value == __CURATT(marker_style)) return;
  430.  
  431.    DEBUG_AIDS{
  432.       SRGP_trace (SRGP_logStream, "SRGP_setMarkerStyle  %d\n", value);
  433.       srgp_check_system_state();
  434.       srgp_check_marker_style(value);
  435.       LeaveIfNonFatalErr();
  436.    }
  437.  
  438.    srgp__curActiveCanvasSpec.attributes.marker_style = value;
  439. }
  440.  
  441.  
  442.  
  443. #ifdef X11
  444. /** TRANSLATING SRGP DASHES TO X 
  445. **/
  446. #define LENGTH_OF_DASH_LIST   4
  447. static char dot[] = {4,4,4,4};
  448. static char dash[] = {10,5,10,5};
  449. static char dotdash[] = {12,4,4,4};
  450. static char *(dashmap[NUMBER_OF_LINE_STYLES ])
  451.    { /*CONTINUOUS: unimportant*/ 0,
  452.      /*DASHED*/ dash,
  453.      /*DOTTED*/ dot,
  454.      /*DOT_DASHED*/ dotdash };
  455.  
  456.  
  457. /** STATIC INTERNAL: SetXLineAttributes()
  458. Notice that when the user desires a line-width of 1, we use 0.
  459. This uses the hardware's fastest line-drawer, according to X.
  460. **/
  461.  
  462. static void SetXLineAttributes(void)
  463. {
  464.    XSetLineAttributes
  465.       (
  466.        srgpx__display,
  467.        srgp__curActiveCanvasSpec.gc_frame,
  468.        ((srgp__curActiveCanvasSpec.attributes.line_width == 1) ?
  469.     0 : srgp__curActiveCanvasSpec.attributes.line_width),
  470.        ((srgp__curActiveCanvasSpec.attributes.line_style==CONTINUOUS) ?
  471.     LineSolid : LineOnOffDash),
  472.        CapButt,        /* CAPS and JOINS are no-ops when line width = 0 */
  473.        JoinBevel);
  474. }
  475. #endif
  476.  
  477.  
  478.  
  479. /*!*/
  480. void
  481. SRGP_setLineStyle (lineStyle value)
  482. {
  483.    if (value == __CURATT(line_style)) return;
  484.  
  485.    DEBUG_AIDS{
  486.       SRGP_trace (SRGP_logStream, "SRGP_setLineStyle  %d\n", value);
  487.       srgp_check_system_state();
  488.       srgp_check_line_style(value);
  489.       LeaveIfNonFatalErr();
  490.    }
  491.  
  492.    srgp__curActiveCanvasSpec.attributes.line_style = value;
  493.  
  494. #ifdef X11
  495.    if (value != CONTINUOUS)
  496.       XSetDashes (srgpx__display, srgp__curActiveCanvasSpec.gc_frame,
  497.           0, dashmap[value], LENGTH_OF_DASH_LIST);
  498.    SetXLineAttributes();
  499. #endif
  500. }
  501.  
  502.  
  503.  
  504. /*!*/
  505. void
  506. SRGP_setLineWidth (int value)
  507. {
  508.    if (value == __CURATT(line_width)) return;
  509.  
  510.    DEBUG_AIDS{
  511.       SRGP_trace (SRGP_logStream, "SRGP_setLineWidth  %d\n", value);
  512.       srgp_check_system_state();
  513.       srgp_check_line_width(value);
  514.       LeaveIfNonFatalErr();
  515.    }
  516.  
  517.    srgp__curActiveCanvasSpec.attributes.line_width = value;
  518.    
  519. #ifdef X11
  520.    SetXLineAttributes ();
  521. #endif
  522. #ifdef THINK_C
  523.    PenSize (value,value);
  524. #endif
  525.  
  526.  
  527.  
  528.  
  529.  
  530. /** ATTRIBUTES RELATED TO COLOR
  531. **/
  532.  
  533. void
  534. SRGP_setPlaneMask (int value)
  535. {
  536.    if (value == __CURATT(plane_mask)) return;
  537.  
  538.    DEBUG_AIDS{
  539.       SRGP_trace (SRGP_logStream, "SRGP_setPlaneMask  %x\n", value);
  540.       srgp_check_system_state();
  541.       LeaveIfNonFatalErr();
  542.    }
  543.  
  544.    srgp__curActiveCanvasSpec.attributes.plane_mask = value;
  545.  
  546. #ifdef X11
  547.    XSetPlaneMask
  548.       (srgpx__display, 
  549.        srgp__curActiveCanvasSpec.gc_fill, (unsigned long) value);
  550.    XSetPlaneMask
  551.       (srgpx__display, 
  552.        srgp__curActiveCanvasSpec.gc_frame, (unsigned long) value);
  553. #endif
  554. }
  555.  
  556.  
  557. void
  558. SRGP_setColor (int value)
  559. {
  560.    if (value == __CURATT(color)) return;
  561.  
  562.    DEBUG_AIDS{
  563.       SRGP_trace (SRGP_logStream, "SRGP_setColor  %x\n", value);
  564.       srgp_check_system_state();
  565.       SRGP_correct_color(value);
  566.       LeaveIfNonFatalErr();
  567.    }
  568.  
  569.    if (value > srgp__max_pixel_value)
  570.       value = srgp__max_pixel_value;
  571.    srgp__curActiveCanvasSpec.attributes.color = value;
  572.  
  573. #ifdef X11
  574.    XSetForeground(srgpx__display, srgp__curActiveCanvasSpec.gc_fill,
  575.           XCOLOR(COLORINDEX(value)));
  576.    XSetForeground(srgpx__display, srgp__curActiveCanvasSpec.gc_frame,
  577.           XCOLOR(COLORINDEX(value)));
  578. #endif
  579.  
  580. #ifdef THINK_C
  581. #ifdef COLOR_QUICKDRAW
  582.    srgp__curActiveCanvasSpec.drawable.win->fgColor = (COLORINDEX(value));
  583. #else
  584.    ComputeFrameTransfermode();
  585.    ComputeFillTransfermode();
  586.    SetTextTransfermode();
  587. #endif
  588. #endif
  589. }
  590.  
  591.  
  592.  
  593. void
  594. SRGP_setBackgroundColor (int value)
  595. {
  596.    if (value == __CURATT(background_color)) return;
  597.  
  598.    DEBUG_AIDS{
  599.       SRGP_trace (SRGP_logStream, "SRGP_setBackgroundColor  %x\n", value);
  600.       srgp_check_system_state();
  601.       SRGP_correct_color(value);
  602.       LeaveIfNonFatalErr();
  603.    }
  604.  
  605.    if (value > srgp__max_pixel_value)
  606.       value = srgp__max_pixel_value;
  607.    srgp__curActiveCanvasSpec.attributes.background_color = value;
  608.  
  609. #ifdef X11
  610.    XSetBackground(srgpx__display, srgp__curActiveCanvasSpec.gc_fill,
  611.           XCOLOR(COLORINDEX(value)));
  612.    XSetBackground(srgpx__display, srgp__curActiveCanvasSpec.gc_frame,
  613.           XCOLOR(COLORINDEX(value)));
  614. #endif
  615.  
  616. #ifdef THINK_C
  617. #ifdef COLOR_QUICKDRAW
  618.    srgp__curActiveCanvasSpec.drawable.win->bkColor = (COLORINDEX(value));
  619. #endif
  620. #endif
  621. }
  622.  
  623.  
  624.  
  625. /** Load Single Color
  626. A convenience subroutine for setting a single color table entry
  627. **/
  628. void SRGP_loadSingleColor
  629.    (int startentry,
  630.     unsigned short redi, 
  631.     unsigned short greeni,
  632.     unsigned short bluei)
  633. {
  634.    PUSH_TRACE;
  635.    SRGP_loadColorTable (startentry, 1, &redi, &greeni, &bluei);
  636.    POP_TRACE;
  637. }
  638.  
  639.  
  640.  
  641.  
  642. /** FONT
  643. The frame gc is used to draw text.  This is a cheat, and violates SRGP's
  644. spec.  This will be fixed someday.
  645. **/
  646. void
  647. SRGP_setFont (int value)
  648. {
  649.    if (value == __CURATT(font)) return;
  650.  
  651.    DEBUG_AIDS{
  652.       SRGP_trace (SRGP_logStream, "SRGP_setFont  %d\n", value);
  653.       srgp_check_system_state();
  654.       srgp_check_extant_font(value);
  655.       LeaveIfNonFatalErr();
  656.    }
  657.  
  658.    srgp__curActiveCanvasSpec.attributes.font = value;
  659.  
  660. #ifdef X11
  661.    XSetFont
  662.       (srgpx__display,
  663.        srgp__curActiveCanvasSpec.gc_frame,
  664.        srgp__fontTable[value]->fid);
  665. #endif
  666. #ifdef THINK_C
  667.       TextFont(srgp__fontTable[value].txFont);
  668.       TextSize(srgp__fontTable[value].txSize);
  669.       TextFace(srgp__fontTable[value].txFace);
  670. #endif
  671. }
  672.  
  673.    
  674.  
  675. /** BATCH SET ATTRIBUTES
  676. Woefully inefficient, but at least I don't reset attributes whose
  677. value has not changed.
  678. **/
  679.  
  680. void
  681. SRGP_setAttributes (attribute_group *att_group)
  682. {
  683.    SRGP_trace (SRGP_logStream, "SRGP_setAttributes 0x%x\n", att_group);
  684.    PUSH_TRACE;
  685.    SRGP_setWriteMode (att_group->write_mode);
  686.    SRGP_setClipRectangle (att_group->clip_rectangle);
  687.  
  688.    SRGP_setFont (att_group->font);
  689.    SRGP_setLineStyle (att_group->line_style);
  690.    SRGP_setLineWidth (att_group->line_width);
  691.    SRGP_setColor (att_group->color);
  692.    SRGP_setPlaneMask (att_group->plane_mask);
  693.    SRGP_setBackgroundColor (att_group->background_color);
  694.    SRGP_setFillStyle (att_group->fill_style);
  695.    SRGP_setFillPixmapPattern (att_group->fill_pixmap_pattern_id);
  696.    SRGP_setFillBitmapPattern (att_group->fill_bitmap_pattern_id);
  697.    SRGP_setPenStyle (att_group->pen_style);
  698.    SRGP_setPenPixmapPattern (att_group->pen_pixmap_pattern_id);
  699.    SRGP_setPenBitmapPattern (att_group->pen_bitmap_pattern_id);
  700.    SRGP_setMarkerSize (att_group->marker_size);
  701.    SRGP_setMarkerStyle (att_group->marker_style);
  702.    POP_TRACE;
  703. }
  704.